#include "loadconfig.h"
#include "modbusthread.h"

LoadConfig::LoadConfig(QObject *parent) : QObject(parent)
{
}

void LoadConfig::LoadCsv(QString fileName)
{
    //解析配置文件
    ParamList = parseCsv(fileName);
    if(ParamList.isEmpty())  return;

    //协议名称
    ProfileName = ParamList.at(HEADR_).at(CNF_NAME_COL);

    //波特率
    baud = ParamList.at(HEADR_).at(CNF_BAUD_COL).toInt();

    //从机地址
    id = ParamList.at(HEADR_).at(CNF_ADDR_COL).toInt();

    //窗口配置
    TabSetUpParamsMap = parseKeyValue(ParamList.at(HEADR_).at(TAB_NUM_COL));
     GpMap   =          parseGroupToMap(ParamList.at(HEADR_).at(TAB_NUM_COL + 1));

    //获取完成后去掉前三行，方便外部使用参数列表ParamList
    ParamList.erase(ParamList.begin(),ParamList.begin() + 3);

    //获取modbus读取首地址和长度
    QMap<QString, int> ModbusRead_Config = countDataSegments(ParamList);
    emit(SendMB_Cnf(ModbusRead_Config));


    qDebug() << "协议名：" << ProfileName;
    qDebug() << "波特率：" << baud;
    qDebug() << "窗口参数" << TabSetUpParamsMap;
    qDebug() << "窗口分组参数"<< GpMap;
//    qDebug() << ParamList;
//    qDebug() << "size:" << ParamList.size();
}

QStringList LoadConfig::parseComplexLine(const QString &line)
{
    QStringList fields;
    QString currentField;
    bool inQuotes = false;

    for (QChar c : line)
    {
        if (c == '"' && (currentField.isEmpty() || currentField.back() != '\\'))
        {
            inQuotes = !inQuotes;
        } else if (c == ',' && !inQuotes)
        {
            fields.append(currentField);
            currentField.clear();
        } else
        {
            currentField += c;
        }
    }
    fields.append(currentField);
    return fields;
}

QVector<QStringList> LoadConfig::parseCsv(const QString &filePath)
{
    QVector<QStringList> data;
    QFile file(filePath);

    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        qWarning() << "文件打开失败:" << file.errorString();
        return data;
    }

    QTextStream in(&file);
    while (!in.atEnd())
    {
        QString line = in.readLine();
        QStringList fields = parseComplexLine(line);

        // 去除字段首尾空白字符
        for (QString &field : fields)
        {
            field = field.trimmed();
        }

        data.append(fields);
    }
    file.close();
    return data;
}

QMap<QString, int> LoadConfig::countDataSegments(const QVector<QStringList> &csvData)
{
    QMap<QString, int> segmentCounts;  // 存储 <地址, 行数>
    QString currentAddress;            // 当前数据段的地址
    bool inSegment = false;            // 是否正在统计一个数据段

    for (int i = 0; i < csvData.size(); ++i) {
        const QStringList& row = csvData[i];
        if (row.isEmpty()) {
            continue;  // 跳过空行
        }

        // 检查是否是数据段起始行（例如 "0x0000"）
        if (row.at(2).startsWith("0x")) {
            currentAddress = row.at(2);  // 直接提取地址（如 "0x0000"）
            segmentCounts[currentAddress] = 1;  // 初始化计数（包含当前行）
            inSegment = true;
        }
        // 如果是数据行（非标题行），且当前在一个数据段中
        else if (inSegment) {
            segmentCounts[currentAddress]++;
        }
    }
//    // 输出统计结果
//    qDebug() << "数据段行数统计:";
//    for (auto it = segmentCounts.begin(); it != segmentCounts.end(); ++it) {
//        qDebug() << it.key() << ":" << it.value() << "行";
//    }
    return segmentCounts;
}

QMap<int, QStringList> LoadConfig::parseGroupToMap(const QString &input) {
    QMap<int, QStringList> result;

    // 先按","分割整个字符串
    QStringList parts = input.split(',');

    int currentKey = -1;

    for (const QString& part : parts) {
        // 检查是否是新的键部分（包含":"）
        if (part.contains(':')) {
            QStringList keyValue = part.split(':');
            if (keyValue.size() == 2) {
                bool ok;
                currentKey = keyValue[0].toInt(&ok);
                if (ok) {
                    result[currentKey].append(keyValue[1]);
                }
            }
        } else {
            // 是值部分，添加到当前键的列表中
            if (currentKey != -1) {
                result[currentKey].append(part);
            }
        }
    }

    return result;
}

QMap<int, QString> LoadConfig::parseKeyValue(const QString &dataStr)
{
    QMap<int, QString> resultMap;
    // 1. 按逗号分割键值对
    QStringList pairs = dataStr.split(',', Qt::SkipEmptyParts);
    for (const QString &pair : pairs)
    {
        // 2. 按冒号分割键和值
        QStringList keyValue = pair.split(':', Qt::SkipEmptyParts);

        if (keyValue.size() != 2)
        {
            qWarning() << "Invalid pair format:" << pair;
            continue; // 跳过格式错误的键值对
        }
        // 3. 尝试将 key 转为 int
        bool ok = false;
        int key = keyValue[0].toInt(&ok);
        if (!ok)
        {
            qWarning() << "Invalid key (not an integer):" << keyValue[0];
            continue; // 跳过无效的 key
        }
        // 4. 存入 QMap
        resultMap.insert(key, keyValue[1]);
    }

    return resultMap;
}
